package queue;

public class MyQueueByArray {
    private String[] arr = null;
    private int head = 0;
    private int tail = 0;
    private int size = 0;

    public MyQueueByArray(){
        arr = new String[1000];
    }

    public MyQueueByArray(int capacity){
        arr = new String[capacity];
    }

    public void offer(String val){
        //如果队列满了,直接返回
        if(size == arr.length){
            //也可以抛出异常,和扩容,但一般不建议扩容,因为数组的好处就是限制队列元素上限,
            //加入扩容后这个优势就没了
            return;
        }
        arr[tail] = val;
        tail++;
        //重新返回到数组最前面
        //判定加赋值 cmp指令 + mov指令 大部分情况下只需要执行一次cmp指令
        if(tail  == arr.length){
            tail = 0;
        }
        size++;
        //这里还有另一种写法
//        tail = (tail + 1) % arr.length;  而这里则是100%要执行后面的%,也就是执行mov指令
        //而cpu执行加减的速度又远远高于执行乘除的速度,因此第一种写法比第二种运行要快
        //但是不管是从开发效率,还是运行效率来看,都一种写法都明显更好
    }

    public String poll(){
        if(size == 0){
            return null;
        }
        String val = arr[head];
        head++;
        if(head  == arr.length){
            head = 0;
        }
        size--;
        return val;
    }

    public String peek(){
        if(size == 0){
            return null;
        }
        return arr[head];
    }

    public boolean isEmpty(){
        return size == 0;
    }

    public int size(){
        return size;
    }

    public static void main(String[] args) {
        MyQueueByArray queue = new MyQueueByArray();
        queue.offer("1");
        queue.offer("2");
        queue.offer("3");
        queue.offer("4");
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.peek());
        System.out.println(queue.size());
    }
}
